/**
 * Copyright (c) 2017, Alex. All rights reserved.
 */
package com.oschina.bottle.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * 处理数字工具
 *
 * ++++ 将浮点数转换其他格式
 *
 * @author <a href="mailto:zhongchao@gegejia.com">zhong</a>
 * @version 1.0 2017/9/27
 * @since 1.0
 */
public class MathUtils {

    static DecimalFormat decimalFormat = new DecimalFormat("###################.##");

    /**
     * 去除数字的尾0 (将自动实现四舍五入，保留两位小数。末尾为0的自动去掉)
     */
    public static String removeZero(Object number) {
        if (number instanceof String) {
            return decimalFormat.format(new BigDecimal(String.valueOf(number)));
        }
        return decimalFormat.format(number);
    }

    /**
     * double 保留n位小数, 返回String型
     *
     * @param number 待格式化的数字
     * @param scale 保留小数的位数
     */
    public static String roundToString(double number, int scale) {
        return roundToString(number, scale, false);
    }

    /**
     * double 保留n位小数, 返回String型
     *
     * @param number 待格式化的数字
     * @param scale 保留小数的位数
     * @param removeZero 是否去最后为的0
     */
    public static String roundToString(double number, int scale, boolean removeZero) {
        BigDecimal bigDecimal = round(number, scale, BigDecimal.ROUND_HALF_UP);
        if (removeZero) {
            return MathUtils.removeZero(bigDecimal);
        }
        return bigDecimal.toString();
    }

    /**
     * double 保留n位小数, 返回double型
     *
     * @param number 待格式化的数字
     * @param scale 保留小数的位数
     */
    public static double round(double number, int scale) {
        return round(number, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * double 保留n位小数, 返回double型
     *
     * @param number 待格式化的数字
     * @param scale 保留小数的位数
     */
    public static float round2Float(double number, int scale) {
        return round(number, scale, BigDecimal.ROUND_HALF_UP).floatValue();
    }

    /**
     * double 保留n位小数, 返回int型
     *
     * @param number 待格式化的数字
     */
    public static int round2Long(double number) {
        return round(number, 0, BigDecimal.ROUND_HALF_UP).intValue();
    }

    /**
     * double 保留n位小数, 返回long型
     *
     * @param number 待格式化的数字
     */
    public static long round2Int(double number) {
        return round(number, 0, BigDecimal.ROUND_HALF_UP).longValue();
    }

    /**
     * double 保留n位小数, 返回BigDecimal型
     *
     * @param number 待格式化的数字
     * @param scale 保留小数的位数
     */
    public static BigDecimal round(double number, int scale, int mode) {
        return new BigDecimal(String.valueOf(number)).setScale(scale, mode);
    }
}
